﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using RegraNegocio;
using System.Globalization;

namespace PedidoWeb
{
    public partial class Produto : System.Web.UI.Page
    {
        private List<Model.Fornecedor> fornecedores = null;
        private List<Model.Categoria> categorias = null;
        private List<Model.Fabricante> fabricantes = null;
        private Model.Produto produto = null;

        public Produto() {
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (Request.QueryString["mensagem"] != null)
            {
                this.adicionarMensagem(Request.QueryString["mensagem"]);
            }

            if (!Page.IsPostBack)
            {
                this.populaComboBoxFornecedores();
                this.populaComboBoxCategoria();
                this.populaComboBoxFabricante();
            }
        }

        private void populaComboBoxFornecedores()
        {
            fornecedores = FornecedorBO.getInstance().recuperarTodosFornecedores();

            cmbFornecedor.DataSource = fornecedores;
            cmbFornecedor.DataValueField = "codigo";
            cmbFornecedor.DataTextField = "nome";
            cmbFornecedor.DataBind();
        }

        private void populaComboBoxCategoria()
        {
            categorias = CategoriaBO.getInstance().recuperarTodasCategorias();

            cmbCategoria.DataSource = categorias;
            cmbCategoria.DataTextField = "nome";
            cmbCategoria.DataValueField = "codigo";
            cmbCategoria.DataBind();
        }

        private void populaComboBoxFabricante()
        {
            fabricantes = FabricanteBO.getInstance().recuperarTodosFabricantes();

            cmbFabricante.DataSource = fabricantes;
            cmbFabricante.DataTextField = "nome";
            cmbFabricante.DataValueField = "codigo";
            cmbFabricante.DataBind();
        }

        protected void botaoCadastrar_Click(object sender, EventArgs e)
        {
            this.removerMensagens();

            produto = new Model.Produto();
            String mensagem = string.Empty;
            
            List<String> erros = null;
            int acao = cmbAcao.SelectedIndex;

            if (acao == 0) {
                erros = this.verificaCampoNumerico();
                erros.AddRange(this.verificaCampoMonetario());

                if (!erros.Any())
                {

                    produto = this.populaProduto(produto);

                    try
                    {
                        if (botaoCadastrar.Text.Equals("Cadastrar"))
                        {
                            ProdutoBO.getInstance().gravar(produto);
                        }
                        else {
                            ProdutoBO.getInstance().editar(produto);
                        }

                        mensagem = "Sucesso na inserção/alteração do produto!";
                    }
                    catch (Exception cause)
                    {
                        this.adicionarMensagem(cause.Message);
                        return;
                    }
                }
                else
                {
                    System.Text.StringBuilder mensagemErro = new System.Text.StringBuilder();

                    foreach (string erro in erros)
                    {
                        mensagemErro.Append(erro + "\n");
                    }

                    this.adicionarMensagem(mensagemErro.ToString());
                    return;
                }
            }
            else if (acao == 1)
            {
                if (txtCodigo.Text.Equals("") && txtNome.Text.Equals(""))
                {
                    this.adicionarMensagem("Favor preencher um dos campos para busca: Codigo / Nome");
                    return;
                }

                if (!txtCodigo.Text.Equals(""))
                {
                    if (this.isNumero(txtCodigo.Text))
                    {
                        produto.Codigo = int.Parse(txtCodigo.Text);
                    }
                    else
                    {
                        this.adicionarMensagem("O código digitado deve ser um número inteiro!");

                        return;
                    }
                }

                if (!txtNome.Text.Equals(""))
                {
                    produto.Nome = txtNome.Text;
                }

                try
                {
                    List<Model.Produto> produtosRecuperados = ProdutoBO.getInstance().recuperarProdutos(produto);

                    if (produtosRecuperados.Any())
                    {
                        dtgResultado.DataSource = null;
                        dtgResultado.DataSource = produtosRecuperados;
                        dtgResultado.DataBind();

                        dtgResultado.Visible = true;

                        return;
                    }
                    else
                    {
                        this.adicionarMensagem("A busca não retornou nenhum resultado!");
                        return;
                    }
                }
                catch (Exception cause)
                {
                    mensagem = cause.Message;
                }
            }
            else 
            { 
                String codigoProduto = txtCodigo.Text;

                if (codigoProduto.Equals(string.Empty))
                {
                    this.adicionarMensagem("É necessário preencher o campo código para exclusão");
                    return;
                }

                if (this.isNumero(codigoProduto))
                {
                    try
                    {
                        produto.Codigo = int.Parse(codigoProduto);
                        ProdutoBO.getInstance().excluir(produto);

                        mensagem = "Sucesso na exclusão do produto - código: " + codigoProduto;
                    }
                    catch (Exception cause)
                    {
                        this.adicionarMensagem("Problemas na exclusão do produto: " + cause.Message);
                        return;
                    }
                }
                else 
                {
                    this.adicionarMensagem("O campo código deve ser preenchido com números inteiros.");
                    return;
                }
            
            }

            Response.Redirect("~/Produto.aspx?mensagem=" + mensagem);
        }

        public List<String> verificaCampoNumerico()
        {

            List<String> erros = new List<String>();

            if (!isNumero(txtQtdeMinima.Text))
            {
                erros.Add("Favor verificar os valores preenchidos para o campo Quantidade Mínima <br />");
            }

            if (!isNumero(txtQtdeEstoque.Text))
            {
                erros.Add("Favor verificar os valores preenchidos para o campo Quantidade Estoque <br />");   
            }

            return erros;
        }

        public List<String> verificaCampoMonetario() {
            List<String> erros = new List<String>();

            if (!isDecimal(txtValor.Text))
            {
                erros.Add("Favor verificar os valores preenchidos para o campo Valor! <br />");
            }

            if (!isDecimal(txtValorCusto.Text)) {
                erros.Add("Favor verificar os valores preenchidos para o campo Valor Custo! <br />");
            }

            return erros;
        }

        public bool isNumero(string valor) {
            int valorNumerico;
            
            return int.TryParse(valor, out valorNumerico);
        }

        public bool isDecimal(string valor)
        {
            decimal valorNumerico;

            return decimal.TryParse(valor, out valorNumerico);
        }

        private void limparCampos() {
            txtCodigo.Text = string.Empty;
            txtNome.Text = string.Empty;
            txtDescricao.Text = string.Empty;
            txtQtdeEstoque.Text = string.Empty;
            txtQtdeMinima.Text = string.Empty;
            txtValor.Text = string.Empty;
            txtValorCusto.Text = string.Empty;
        }

        private Model.Produto populaProduto(Model.Produto produto) {
            if (!txtCodigo.Text.Equals(string.Empty)) {
                produto.Codigo = int.Parse(txtCodigo.Text);
            }

            produto.Nome = txtNome.Text;
            produto.Descricao = txtDescricao.Text;
            produto.Valor = decimal.Parse(txtValor.Text);
            produto.ValorCusto = decimal.Parse(txtValorCusto.Text);
            produto.QuantidadeEstoque = int.Parse(txtQtdeEstoque.Text);
            produto.QuantidadeMinima = int.Parse(txtQtdeMinima.Text);
            produto.Fornecedor = new Model.Fornecedor(int.Parse(cmbFornecedor.SelectedValue));
            produto.Categoria = new Model.Categoria(int.Parse(cmbCategoria.SelectedValue));
            produto.Fabricante = new Model.Fabricante(int.Parse(cmbFabricante.SelectedValue));

            return produto;
        }

        private void removerMensagens() {
            lblMensagem.Text = string.Empty;
            lblMensagem.Visible = false;
        }

        private void camposHabilitadosCadastrar()
        {

            this.lblCodigo.Visible = false;
            this.txtCodigo.Visible = false;

            this.txtNome.Enabled = true;
            this.txtDescricao.Enabled = true;
            this.txtQtdeEstoque.Enabled = true;
            this.txtQtdeMinima.Enabled = true;
            this.txtValor.Enabled = true;
            this.txtValorCusto.Enabled = true;

            this.cmbCategoria.Enabled = true;
            this.cmbFabricante.Enabled = true;
            this.cmbFornecedor.Enabled = true;

            this.dtgResultado.DataSource = null;
            this.dtgResultado.Visible = false;
        }

        private void camposHabilitadosConsultar(bool isConsulta)
        {

            this.lblCodigo.Visible = true;
            this.txtCodigo.Visible = true;

            this.lblNome.Visible = true;
            this.txtNome.Visible = true;

            this.txtNome.Enabled = isConsulta;
            this.txtDescricao.Enabled = false;
            this.txtQtdeEstoque.Enabled = false;
            this.txtQtdeMinima.Enabled = false;
            this.txtValor.Enabled = false;
            this.txtValorCusto.Enabled = false;

            this.cmbCategoria.Enabled = false;
            this.cmbFabricante.Enabled = false;
            this.cmbFornecedor.Enabled = false;

            this.dtgResultado.DataSource = null;
            this.dtgResultado.Visible = false;
        }

        protected void cmbAcao_SelectedIndexChanged(object sender, EventArgs e)
        {
            int acaoSelecionada = cmbAcao.SelectedIndex;
            this.removeMessages();
            this.limparCampos();

            if (acaoSelecionada == 0)
            {
                this.camposHabilitadosCadastrar();

                this.botaoCadastrar.Text = "Cadastrar";
            }
            else if (acaoSelecionada == 1)
            {
                this.camposHabilitadosConsultar(true);

                this.botaoCadastrar.Text = "Consultar";
            }
            else
            {
                this.camposHabilitadosConsultar(false);

                this.botaoCadastrar.Text = "Excluir";
            }

        }

        private void adicionarMensagem(String message) {
            lblMensagem.Text = message;
            lblMensagem.Visible = true;
        }

        private void popularCamposProduto(Model.Produto produto)
        {
            this.populaComboBoxFornecedores();
            this.populaComboBoxCategoria();
            this.populaComboBoxFabricante();

            this.txtCodigo.Text = produto.Codigo.ToString();
            this.txtNome.Text = produto.Nome;
            this.txtDescricao.Text = produto.Descricao;
            this.txtValor.Text = String.Format("{0:0.00}", produto.Valor);
            this.txtValorCusto.Text = String.Format("{0:0.00}", produto.ValorCusto);
            this.txtQtdeEstoque.Text = produto.QuantidadeEstoque.ToString();
            this.txtQtdeMinima.Text = produto.QuantidadeMinima.ToString();
            this.cmbCategoria.SelectedValue = produto.Categoria.Codigo.ToString();
            this.cmbFabricante.SelectedValue = produto.Fabricante.Codigo.ToString();
            this.cmbFornecedor.SelectedValue = produto.Fornecedor.Codigo.ToString();
        }

        protected void dtgResultado_RowEditing(object sender, GridViewEditEventArgs e)
        {
            int codigoProduto = int.Parse(dtgResultado.Rows[e.NewEditIndex].Cells[0].Text.ToString());

            produto = ProdutoBO.getInstance().consultarProduto(codigoProduto);

            this.camposHabilitadosCadastrar();

            this.popularCamposProduto(produto);

            cmbAcao.SelectedIndex = 0;
            botaoCadastrar.Text = "Editar";
        }

        private void removeMessages() {
            lblMensagem.Text = string.Empty;
            lblMensagem.Visible = false;
        }

    }

}